openwrt 使用ebtables限制设备访问外网或内网 您所在的位置:网站首页 openwrt 访问控制 openwrt 使用ebtables限制设备访问外网或内网

openwrt 使用ebtables限制设备访问外网或内网

#openwrt 使用ebtables限制设备访问外网或内网| 来源: 网络整理| 查看: 265

1.条件 固定mac地址

为限制ip的访问控制 通常使用iptables 限制ip部分 ,如果设备更换ip地址,则原有的ip地址列表规则会失效 在局域网内 使用根据设备的mac地址配置ebtables限制目标设备的访问控制. 但是,这样也是有缺陷的,如设备每隔一段时间会使用产生新的,随机的mac地址进行连接,则ebtables的mac匹配会失效 为了限制这种情况,可以设置允许已知的mac连接,未识别的禁止其连接. 做到这种情况 1.1.wifi连接的可使用 允许列表中mac地址连接 如图 在这里插入图片描述 1.2.使用 arp 静态绑定

这样做是为了迫使 连接设备使用固定的mac 进行连接 从而能够使用ebtables 达到限制目的

2. openwrt 安装配置ebtables

2.1 安装

opkg install ebtables ebtables-utils kmod-ebtables-ipv4 kmod-ebtables-ipv6

查看版本

ebtables -V

2.2 创建为启动脚本 创建文件 /etc/init.d/efw 内容如下

#!/bin/sh /etc/rc.common #/etc/init.d/efw START=21 STOP=21 cleartables() { /usr/sbin/ebtables -t $1 -F /usr/sbin/ebtables -t $1 -X /usr/sbin/ebtables -t $1 -Z } boot() { start } start() { ebtables -P INPUT ACCEPT ebtables -P FORWARD ACCEPT ebtables -P OUTPUT ACCEPT # 1.基于mac地址检查 禁止指定的mac设备访问内网 除了一些dns dhcp ntp之外,允许访问外网 # 1. filter mac address which is disallowed to access intranet except some dns dhcp ntp , extranet is allowed # 2. 基于mac地址检查 禁止指定的mac设备访问外网 只能访问内网,禁止访问外网 # 2. filter mac address which is disallowed to access extranet , intranet is allowed #sh files is locale in /usr/efw/* #由于分为多个执行脚本 把他们放置在 /usr/efw/目录下执行 SHDIR=/usr/efw for file in $(ls $SHDIR) do if [ -x $SHDIR/$file ]; then #need arg: add sh $SHDIR/$file add fi done } stop() { cleartables filter cleartables nat #cleartables broute /usr/sbin/ebtables -P INPUT ACCEPT /usr/sbin/ebtables -P FORWARD ACCEPT /usr/sbin/ebtables -P OUTPUT ACCEPT } restart() { cleartables filter cleartables nat #cleartables broute start }

上面的脚本会 遍历调用 /usr/efw 目录下的每个可执行文件 执行动作为 sh $SHDIR/$file add 如果 /usr/efw 目录为空 则仅执行 /usr/sbin/ebtables -P INPUT ACCEPT /usr/sbin/ebtables -P FORWARD ACCEPT /usr/sbin/ebtables -P OUTPUT ACCEPT

/usr/efw 目录 每个可执行文件 可以 各自完成自己的功能 如 disallow_extranet.sh 指定mac地址 禁止访问外网,允许访问内网 disallow_intranet.sh 指定mac地址 禁止访问内网,允许访问外网

2.3 /usr/efw/disallow_extranet.sh 禁止访问外网,允许访问内网

#!/bin/sh #set -x #用法: 单独 调用 #添加 sh disallow-extranet.sh add ; 删除 sh disallow-extranet.sh earse # 这样就不必重启 efw服务 #配合 /etc/init.d/efw 使用 #/usr/efw/disallow_extranet.sh #手动开关 ENABLE=0 禁用 ; =1 启动 ENABLE=1 [ "$ENABLE" = 1 ] || exit 1 #基于mac地址过滤 禁止访问外网 允许访问内网 #-----在这里添加需要限制的mac地址 #DISALLOW_MACLIST="11:11:11:22:22:22,22:22:22:11:11:11" #使用文件记录禁止的mac地址 一个行 用逗号分隔 DISALLOW_MACFILE=/usr/efw/maclist_extranet [ -e $DISALLOW_MACFILE ] || echo "11:22:33:44:55:66,22:22:22:33:33:33"|tee $DISALLOW_MACFILE #需要16进制 这样grep才能匹配 VARMARK=0x123132 IPV4_A="10.0.0.0/8" #IPV4_A_RFC6598="100.64.0.0/10" IPV4_B="172.16.0.0/12" IPV4_C="192.168.0.0/16" IPV4_LOCAL="169.254.0.0/16" IPV4_MCAST="224.0.0.0/4" IPV4_BCAST="255.255.255.255" # 会变成 fc00::/fc00:: 但效果一样 IPV6_LOCAL="fc00::/6" add() { ebtables -t nat -N NOEXTRANET_MARK ebtables -t nat -A PREROUTING -j NOEXTRANET_MARK #ebtables -t nat -A NOEXTRANET_MARK --among-src ${DISALLOW_MACLIST} -j mark --mark-set $VARMARK ebtables -t nat -A NOEXTRANET_MARK --among-src-file $DISALLOW_MACFILE -j mark --mark-set $VARMARK #INPUT ebtables -t filter -N NOEXTRANET_IN ebtables -t filter -A INPUT --mark $VARMARK -j NOEXTRANET_IN #IPV4 ebtables -t filter -A NOEXTRANET_IN -p ipv4 --ip-dst $IPV4_A -j ACCEPT ebtables -t filter -A NOEXTRANET_IN -p ipv4 --ip-dst $IPV4_B -j ACCEPT ebtables -t filter -A NOEXTRANET_IN -p ipv4 --ip-dst $IPV4_C -j ACCEPT ebtables -t filter -A NOEXTRANET_IN -p ipv4 --ip-dst $IPV4_BCAST -j ACCEPT ebtables -t filter -A NOEXTRANET_IN -p ipv4 --ip-dst $IPV4_MCAST -j ACCEPT ebtables -t filter -A NOEXTRANET_IN -p ipv4 --ip-dst $IPV4_LOCAL -j ACCEPT ebtables -t filter -A NOEXTRANET_IN -p ipv4 -j DROP #IPV6 ebtables -t filter -A NOEXTRANET_IN -p ipv6 --ip6-dst $IPV6_LOCAL -j ACCEPT ebtables -t filter -A NOEXTRANET_IN -p ipv6 -j DROP #FORWARD ebtables -t filter -N NOEXTRANET_FWD ebtables -t filter -A FORWARD --mark $VARMARK -j NOEXTRANET_FWD #IPV4 ebtables -t filter -A NOEXTRANET_FWD -p ipv4 --ip-dst $IPV4_A -j ACCEPT ebtables -t filter -A NOEXTRANET_FWD -p ipv4 --ip-dst $IPV4_B -j ACCEPT ebtables -t filter -A NOEXTRANET_FWD -p ipv4 --ip-dst $IPV4_C -j ACCEPT ebtables -t filter -A NOEXTRANET_FWD -p ipv4 --ip-dst $IPV4_BCAST -j ACCEPT ebtables -t filter -A NOEXTRANET_FWD -p ipv4 --ip-dst $IPV4_MCAST -j ACCEPT ebtables -t filter -A NOEXTRANET_FWD -p ipv4 --ip-dst $IPV4_LOCAL -j ACCEPT ebtables -t filter -A NOEXTRANET_FWD -p ipv4 -j DROP #IPV6 ebtables -t filter -A NOEXTRANET_FWD -p ipv6 --ip6-dst $IPV6_LOCAL -j ACCEPT ebtables -t filter -A NOEXTRANET_FWD -p ipv6 -j DROP } earse() { ebtables -t nat -F NOEXTRANET_MARK ebtables -t nat -X NOEXTRANET_MARK ebtables -t filter -D INPUT --mark $VARMARK -j NOEXTRANET_IN ebtables -t filter -D FORWARD --mark $VARMARK -j NOEXTRANET_FWD ebtables -t filter -F NOEXTRANET_FWD ebtables -t filter -X NOEXTRANET_FWD ebtables -t filter -F NOEXTRANET_IN ebtables -t filter -X NOEXTRANET_IN } #reload mac list DISALLOW_MACLIST #修改 DISALLOW_MACLIST 变量后 调用reload重新载入规则 而不是整个efw重载 #sh /usr/efw/disallow_extranet.sh reload reload() { if [ -n "$(ebtables -t nat -L|grep "mark-set $VARMARK")" ]; then ebtables -t nat -F NOEXTRANET_MARK ebtables -t nat -A NOEXTRANET_MARK --among-src-file $DISALLOW_MACFILE -j mark --mark-set $VARMARK fi } # MAIN case "$1" in add) add ;; earse) earse ;; reload) reload ;; *) exit 1 ;; esac exit 0

2.4 /usr/efw 脚本规范 需要提供几个选项 add 添加规则 earse 删除 reload 重载mac列表

如 /etc/init.d/efw 的调用 sh $SHDIR/$file add 启动时创建规则 或者 修改 /usr/efw/maclist_extranet 的mac文件 只能一个行 每个mac地址用逗号分隔 修改完成后调用 sh /usr/efw/disallow_extranet.sh reload 以重载当前的规则 而不是重启整个 /etc/init.d/efw restart



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有